/*
 + 文件名  driver_parameter.c
 + 描述    ：默认参数及校准数据文件
 */
/*
	内存拷贝函数：
	void *memcpy(void *dest, const void *src, size_t n);
	
	//文件系统API函数：
//注册/注销一个工作区（文件系统对象）
FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt);
//入参：工作区（文件系统对象）指针	path:注册/注销工作区的逻辑驱动器号（0-9）	opt:注册工作区是否立即
功能描述：在FATFS模块上注册/注销一个工作区，在使用任何其他文件函数之前，必须使用该函数
为每个卷注册一个工作区。要注销一个工作区，只要指定文件对象为NULL即可，然后该工作区可以被丢弃。
该函数只初始化给定的工作区，以及将该工作区的地址注册到内部表中，不访问磁盘I/O层。
卷装入过程是在f_mount函数后或存储介质改变后的第一次文件访问时完成的

//在驱动器上创建一个文件系统
FRESULT f_mkfs (const TCHAR* path, BYTE sfd, UINT au);
入参：path:待格式化的逻辑驱动器号(0-9)	
sfd:0：在驱动器上的第一个扇区创建一个分区表，然后文件系统
被创建在分区上。称为FDISK格式化，用于硬盘和存储卡。
	  1:文件系统从第一个扇区开始创建，而没有分区表，称为SFD格式化，用于软盘和可移动磁盘
		au:指定每簇中以字节为单位的分配单元大小。数值必须是0或从512到32K之间2的幂。当指定0时
		簇大小取决于卷大小。
功能描述：f_mkfs函数当_FS_READOLNY=0且_USE_MKFS=1时可用

文件系统API函数介绍见链接：
http://blog.csdn.net/l545045612/article/details/7490260
*/

#include "driver_parameter.h"  
#include "stm32f4xx.h"                  // Device header

/* 文件相关定义 */
static  FATFS fs;
static 	FIL file;
static 	DIR DirInf;

/* Mount/Unmount a logical drive */
//注册/注销一个工作区
extern FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt);
/* Create a file system on the volume */
//在驱动器上创建文件系统
extern FRESULT f_mkfs (const TCHAR* path, BYTE sfd, UINT au);

/*----------------------------------------------------------
 + 实现功能：挂载文件系统
----------------------------------------------------------*/
int FAT_Mount_Init(void)
{
	  FRESULT result;
    /* 挂载文件系统 */
    result = f_mount(&fs, "0:", 1);
    if (result != FR_OK)
    {
        result = f_mkfs("0:",1,4096);//格式化FLASH,0,盘符;1,不需要引导区,8个扇区为1个簇
        if (result == FR_OK)
        {
          /* 重新进行挂载 */
          result = f_mount(&fs, "0:", 1);      
					if (result != FR_OK)
          {
			       /* 卸载文件系统 */
             f_mount(NULL, "0:", 0);
             return -2 ;
          }
					
        }
        else
            return -1;
    }
		
    return 0;
}
/*----------------------------------------------------------
 + 实现功能：从文件读取所有配置参数
name  :文件名
----------------------------------------------------------*/
int Para_ReadSettingFromFile(const TCHAR* name,void *buffer,unsigned int Size)
{
	  unsigned short int i;
		u8 res=0;
    FRESULT result;
    UINT bw;
    /* 打开根文件夹 */
    result = f_opendir(&DirInf, "/");
    if (result != FR_OK)
    {
        return -3;
    }
		
    /* 打开文件 */
    result = f_open(&file, name, FA_OPEN_EXISTING | FA_READ);
    if (result !=  FR_OK)
    {
        return -4;
    }
		/* 读取配置文件 */
		for(i=0;i<Size/512;i++)
		{
			res=f_read(&file,buffer,512,&bw);
			if(res)
			{
			  return -4;
			}
		}
		if(Size%512)
		{			
			res=f_read(&file,buffer,Size%512,&bw);
			if(res)
			{
			   return -4;
			}
		}   
		f_close(&file);		
		f_closedir(&DirInf);		
		
		
return 0;		
}

/*----------------------------------------------------------
 + 实现功能：保存所有配置参数到文件
name  :文件名
----------------------------------------------------------*/
int Para_WriteSettingToFile(const TCHAR* name,void* buffer,unsigned int Size)
{ 
    UINT bw;
	  FRESULT result;	
    /* 打开根文件夹 */
    result = f_opendir(&DirInf, "/");
    if (result != FR_OK)
    {			
        return -3;		
    }
    /* 打开文件 */
    result = f_open(&file, name, FA_CREATE_ALWAYS | FA_WRITE);
    if (result !=  FR_OK)
    {				
			  f_closedir(&DirInf);
        return -4;	
    }	
    result = f_write(&file,buffer,Size, &bw);	
		/* 关闭文件*/
		f_close(&file);			
		f_closedir(&DirInf);
		
    if (result != FR_OK)			
    {
      return -5;
    }	
return 1;			
}


